home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1996-09-27 | 13.4 KB | 405 lines |
- IMPLEMENTATION MODULE DuWindow;
-
- (*$S-*)(*$T-*)(*$A+*)
- (*
- PART OF DirUtil for Modula 2
-
- This creates, opens and maintains the DirUtil window.
- It contains a couple of other importable routines for
- user alterations.
-
- Written: 3/21/87 by Greg Browne
-
- Compiles on TDI's Modula-2 Compiler version 2.20a
-
- NOTES: I kept being bugged with RefreshWindow not being exported from
- Intuition as a flag. Then I found that it is either misspelled
- in the .def module (as ResfreshWindow) or that it is supposed
- to mean ResetFreshWindow. Don't know whats up but it works now.
-
- *)
-
- FROM SYSTEM IMPORT ADR, BYTE, ADDRESS, NULL,TSIZE,CODE;
- FROM Intuition IMPORT ActivationFlags,ActivationFlagSet,
- Gadget,GadgetFlags,GadgetFlagSet,GadgetPtr,
- PropFlags,PropInfo,PropFlagSet,StringInfo,
- IntuitionTextPtr,IntuitionText,IntuitionName,
- IntuitionBase,IntuiMessagePtr,RequesterPtr,
- Window,WindowFlags,WindowPtr,NewWindow,
- IDCMPFlags,IDCMPFlagSet,WindowFlagSet,
- WBenchScreen,Border,SmartRefresh,ScreenFlagSet,
- Image;
- FROM GraphicsLibrary IMPORT GraphicsName, GraphicsBase,DrawingModes,
- DrawingModeSet,Jam1;
- FROM Libraries IMPORT OpenLibrary,CloseLibrary;
- FROM Windows IMPORT OpenWindow,CloseWindow;
- FROM Gadgets IMPORT RefreshGadgets,HighNone,HighComplement,
- ModifyProp,BoolGadget,PropGadget,StrGadget,
- AddGadget,RemoveGadget;
-
- (*--------------------------------------------------------------------*)
-
- (* ALL CONSTANTS AND MOST VARIABLES/TYPES DEFINED IN .DEF FILE
- FOR IMPORTATION
-
- CONST
- StringBufSize = 255;
- RegFlags = ActivationFlagSet{RelVerify,GadgetImmediate};
- StringFlags = ActivationFlagSet{StringCenter} + RegFlags;
- JamTwo = DrawingModeSet{Jam2};
- SliderFlags = PropFlagSet{FreeVert,AutoKnob};
-
- TYPE
- WBColors = (Blue,White,Black,Green); (* My workbench colors *)
-
- Gadgets are addressed as a set. First are the devices, then the message
- string gadgets, then the command gadgets, and finally the slider. Note
- that this is larger than a BITSET already, so the 'GadgetID' is passed as
- a set name and converted as CARDINAL(ORD(whatever)). Expansion of the set
- should be easy, with only screen positioning being the hard part.
-
- GadgetNames = (df0,df1,df2,dh0,dh1,ram,vd0,
- run,source,dest,msg,
- filewindow,
- arc,bytes,clear,copy,copydel,deldir,edit,execfr,execrf,
- hprint,htype,info,makedir,move,parent,print,rename,
- root,runfr,runrf,select,show,type,unarc,zapfile,
- dtor,dtos,rtod,rtos,stod,stor,swapsd,swaprd,swaprs,
- slider);
-
- END OF EXTERNAL TYPES & CONSTANTS *)
-
- TYPE
- BorderTypes = (filewind,rsd,device,command,message);
-
- VAR
- SlideImage : Image;
- Borders : ARRAY BorderTypes OF Border;
- SlideInfo : PropInfo;
-
- (* EXTERNAL AVAILABLE VARIABLES
-
- IOStringInfo : ARRAY[run..filewindow] OF StringInfo;
- NullReqPtr : RequesterPtr; (* initialized to be NULL always *)
- DuWindowPtr : WindowPtr;
- IOString : ARRAY[run..filewindow] OF ARRAY[0..StringBufSize-1] OF CHAR;
- GadTxt : ARRAY GadgetNames OF IntuitionText;
- DuGads : ARRAY GadgetNames OF Gadget;
-
- *)
- (* ---------------------------*)
- (* INTERNAL ONLY PROCEDURES *)
- (* ---------------------------*)
-
- PROCEDURE InitWindow(VAR text:ARRAY OF CHAR;FirstGad:ADDRESS):WindowPtr;
- VAR w : NewWindow;
- BEGIN
- WITH w DO
- LeftEdge := 0; TopEdge := 0;
- Width := 640; Height := 156;
- DetailPen := BYTE (0); BlockPen := BYTE (1);
- Title := ADR(text);
- Flags := WindowFlagSet{WindowSizing,WindowDepth,WindowDrag,RMBTrap,
- Activate,NoCareRefresh,WindowClose} + SmartRefresh;
- IDCMPFlags := IDCMPFlagSet{CloseWindowFlag,MouseButtons,
- ResfreshWindow,GadgetUp};
- Type := ScreenFlagSet {WBenchScreen};
- CheckMark := NULL;
- FirstGadget := FirstGad;
- Screen := NULL; BitMap := NULL;
- MinWidth := 150; MinHeight := 75;
- MaxWidth := 640; MaxHeight := 156;
- END;
- RETURN OpenWindow(w)
- END InitWindow;
-
- (* ---------------------------*)
- (* Entry/exit code off to create "static" border structures with CODE *)
- (* This method saves size since I am keeping it under 32767 for $A+ *)
- (* ---------------------------*)
-
- (*$P-*)
-
- PROCEDURE CBorder;
- BEGIN
- CODE(0FFFFH,0FFFFH,69,0FFFFH,69,9,0FFFFH,9,0FFFFH,0FFFFH);
- END CBorder;
-
- (*$P-*)
-
- PROCEDURE DBorder;
- BEGIN
- CODE(0FFFFH,0FFFFH,39,0FFFFH,39,9,0FFFFH,9,0FFFFH,0FFFFH);
- END DBorder;
-
- (*$P-*)
-
- PROCEDURE MBorder;
- BEGIN
- CODE(0FFFEH,0FFFEH,576,0FFFEH,576,8,0FFFEH,8,0FFFEH,0FFFEH);
- END MBorder;
-
- (*$P-*)
-
- PROCEDURE RBorder;
- BEGIN
- CODE(0FFFEH,0FFFEH,280,0FFFEH,280,8,0FFFEH,8,0FFFEH,0FFFEH);
- END RBorder;
-
- (*$P-*)
-
- PROCEDURE FBorder;
- BEGIN
- CODE(0FFFFH,0FFFFH,283,0FFFFH,283,121,0FFFFH,121,0FFFFH,0FFFFH);
- END FBorder;
-
- (*$P+*)
-
- (* ---------------------------*)
-
- PROCEDURE SetIText(VAR it :IntuitionText;
- VAR text :ARRAY OF CHAR;
- Left,Top :INTEGER;
- FColor,BColor:WBColors;
- Mode :DrawingModeSet);
- BEGIN
- WITH it DO
- FrontPen := BYTE(ORD(FColor));
- BackPen := BYTE(ORD(BColor));
- DrawMode := BYTE(Mode);
- LeftEdge := Left; TopEdge := Top;
- ITextFont := NULL; IText := ADR(text);
- NextText := NULL;
- END;
- END SetIText;
-
- (* ---------------------------*)
-
- PROCEDURE OneGadget(VAR gadg:Gadget; L,T,W,H:INTEGER;
- GadFlags:GadgetFlagSet; textptr:ADDRESS;
- ActFlags:ActivationFlagSet; Bdr:ADDRESS;
- spinfoptr:ADDRESS; GadType:CARDINAL;
- GadID:GadgetNames);
- BEGIN
- WITH gadg DO
- NextGadget := NULL;
- LeftEdge := L; TopEdge := T;
- Width := W; Height := H;
- Flags := GadFlags; Activation := ActFlags;
- GadgetType := GadType; GadgetRender := Bdr;
- SelectRender := NULL; GadgetText := textptr;
- MutualExclude := 0; SpecialInfo := spinfoptr;
- GadgetID := CARDINAL(ORD(GadID));
- UserData := NULL;
- END
- END OneGadget;
-
- (* ---------------------------*)
-
- PROCEDURE InitGadgets():ADDRESS;
- (*
- Procedure to initialize all the gadgets and related structures
- internal to the module only
- *)
- VAR i,m:GadgetNames; j,k: CARDINAL;
- BEGIN
- WITH Borders[command] DO (* Point to the borders *)
- LeftEdge := 0; TopEdge := 0; (* And define color/type *)
- FrontPen := BYTE(1); BackPen := BYTE(0);
- DrawMode := BYTE(Jam1); Count := BYTE(5);
- XY := ADDRESS(CBorder); NextBorder := NULL
- END;
- Borders[device] := Borders[command]; (* all same except sizes *)
- Borders[device].XY := ADDRESS(DBorder);
- Borders[message] := Borders[command];
- Borders[message].XY := ADDRESS(MBorder);
- Borders[rsd] := Borders[command];
- Borders[rsd].XY := ADDRESS(RBorder);
- Borders[filewind] := Borders[command];
- Borders[filewind].XY := ADDRESS(FBorder);
-
- (* This section sets up the gadget text and colors/rendering *)
-
- SetIText(GadTxt[df0], "df0:", 3,1,Black,Blue,Jam1);
- SetIText(GadTxt[df1], "df1:", 3,1,Black,Blue,Jam1);
- SetIText(GadTxt[df2], "df2:", 3,1,Black,Blue,Jam1);
- SetIText(GadTxt[dh0], "dh0:", 3,1,Black,Blue,Jam1);
- SetIText(GadTxt[dh1], "dh1:", 3,1,Black,Blue,Jam1);
- SetIText(GadTxt[ram], "ram:", 3,1,Black,Blue,Jam1);
- SetIText(GadTxt[vd0], "vd0:", 3,1,Black,Blue,Jam1);
- SetIText(GadTxt[run], "R", -14,0,Green,Blue,Jam1);
- SetIText(GadTxt[source], "S", -14,0,Green,Blue,Jam1);
- SetIText(GadTxt[dest], "D", -14,0,Green,Blue,Jam1);
- SetIText(GadTxt[msg], "M", -14,0,Green,Blue,Jam1);
- SetIText(GadTxt[filewindow],"", 0,0,Green,Blue,Jam1);
- SetIText(GadTxt[arc], "ARC", 22,1,White,Blue,Jam1);
- SetIText(GadTxt[bytes], "BYTES", 14,1,White,Blue,Jam1);
- SetIText(GadTxt[clear], "CLEAR", 14,1,White,Blue,Jam1);
- SetIText(GadTxt[copy ], "COPY", 18,1,White,Blue,Jam1);
- SetIText(GadTxt[copydel], "COPYDEL", 6,1,White,Blue,Jam1);
- SetIText(GadTxt[deldir], "DELDIR", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[edit ], "EDIT", 18,1,White,Blue,Jam1);
- SetIText(GadTxt[execfr], "EXEC f+R",2,1,White,Blue,Jam1);
- SetIText(GadTxt[execrf], "EXEC R+f",2,1,White,Blue,Jam1);
- SetIText(GadTxt[hprint], "HPRINT", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[htype], "HTYPE", 14,1,White,Blue,Jam1);
- SetIText(GadTxt[info], "INFO", 18,1,White,Blue,Jam1);
- SetIText(GadTxt[makedir], "MAKEDIR", 6,1,White,Blue,Jam1);
- SetIText(GadTxt[move], "MOVE", 18,1,White,Blue,Jam1);
- SetIText(GadTxt[parent], "PARENT", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[print], "PRINT", 14,1,White,Blue,Jam1);
- SetIText(GadTxt[print], "PRINT", 14,1,White,Blue,Jam1);
- SetIText(GadTxt[rename], "RENAME", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[root], "ROOT", 18,1,White,Blue,Jam1);
- SetIText(GadTxt[runfr], "RUN f+R", 6,1,White,Blue,Jam1);
- SetIText(GadTxt[runrf], "RUN R+f", 6,1,White,Blue,Jam1);
- SetIText(GadTxt[select], "SELECT", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[show], "SHOW", 18,1,White,Blue,Jam1);
- SetIText(GadTxt[type], "TYPE", 18,1,White,Blue,Jam1);
- SetIText(GadTxt[zapfile], "ZAPFILE", 6,1,White,Blue,Jam1);
- SetIText(GadTxt[dtor], "D -> R", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[dtos], "D -> S", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[rtod], "R -> D", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[rtos], "R -> S", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[stod], "S -> D", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[stor], "S -> R", 10,1,White,Blue,Jam1);
- SetIText(GadTxt[swapsd], "SWAP S-D",2,1,White,Blue,Jam1);
- SetIText(GadTxt[swaprd], "SWAP R-D",2,1,White,Blue,Jam1);
- SetIText(GadTxt[swaprs], "SWAP R-S",2,1,White,Blue,Jam1);
-
- WITH SlideInfo DO (* Define the slider information *)
- Flags := SliderFlags;
- VertPot := 8000H;
- VertBody := 0FFFFH;
- END;
-
- FOR i := run TO filewindow DO (* Setup and null all IOStringInfos *)
- IOString[i] := "";
- WITH IOStringInfo[i] DO
- Buffer := ADR(IOString[i]); UndoBuffer := NULL;
- BufferPos := 0; MaxChars := StringBufSize;
- DispPos := 0; NumChars := 0;
- END;
- END;
-
- (* THIS SECTION NOW DEFINES THE GADGETS AND LINKS UP THE STRUCTURES *)
-
- (*Device gadgets*)
- j := 6;
- FOR i := df0 TO vd0 DO
- OneGadget(DuGads[i], j, 14, 38, 9,HighComplement,
- ADR (GadTxt[i]), RegFlags,ADR(Borders[device]),
- NULL, BoolGadget, i);
- INC(j,41)
- END;
-
- (* String gadgets *)
- j := 117;
- FOR i := run TO dest DO
- OneGadget(DuGads[i], 324, j, 280, 10, HighComplement,
- ADR (GadTxt[i]), RegFlags, ADR(Borders[rsd]),
- ADR (IOStringInfo[i]), StrGadget, i);
- INC(j,10);
- END;
-
- OneGadget(DuGads[msg], 28, 147, 576, 10, HighComplement,
- ADR (GadTxt[msg]), RegFlags, ADR(Borders[message]),
- ADR (IOStringInfo[msg]), StrGadget, msg);
-
- OneGadget(DuGads[filewindow], 5, 24, 281, 121, HighNone,
- ADR(GadTxt[filewindow]), RegFlags,ADR(Borders[filewind]),
- NULL,BoolGadget, filewindow);
-
- (* Command gadgets *)
- j := 14; k := 308;
- FOR i := arc TO swaprs DO
- OneGadget(DuGads[i], k, j, 68, 9, HighComplement,
- ADR (GadTxt[i]), RegFlags,ADR(Borders[command]),
- NULL, BoolGadget, i);
- INC(j,10);
- IF j>104 THEN
- j := 14;
- INC(k,71);
- END;
- END;
-
-
- (* Slider gadget *)
-
- OneGadget(DuGads[slider], 289, 23, 18, 122, HighComplement,
- NULL, RegFlags, ADR(SlideImage),
- ADR(SlideInfo), PropGadget, slider);
-
-
- FOR i := df0 TO swaprs DO
- m := i; INC(m);
- DuGads[i].NextGadget := ADR(DuGads[m])
- END;
-
- RETURN ADR(DuGads[df0])
- END InitGadgets;
-
-
- (* ---------------------------*)
- (* EXTERNAL PROCEDURES *)
- (* ---------------------------*)
-
-
- PROCEDURE SlidePot():CARDINAL;
- (*
- Function returns the current value of the slider VertPot)
- *)
- BEGIN
- RETURN CARDINAL(SlideInfo.VertPot);
- END SlidePot;
-
-
- PROCEDURE ResetSlider(bod:CARDINAL);
- (*
- Resets slide gadget size to the size passed in
- *)
- BEGIN
- ModifyProp(DuGads[slider],DuWindowPtr,NullReqPtr^,SliderFlags,0,0,0,bod);
- END ResetSlider;
-
- (* ---------------------------*)
-
- PROCEDURE CloseDuWindow;
- (*
- Closes the window and intuition and graphics bases if they are open
- *)
-
- BEGIN
- IF (DuWindowPtr # NULL) THEN CloseWindow (DuWindowPtr^) END;
- IF IntuitionBase <> 0 THEN CloseLibrary(IntuitionBase) END;
- IF GraphicsBase <> 0 THEN CloseLibrary(GraphicsBase) END;
- END CloseDuWindow;
-
- (* ---------------------------*)
-
- PROCEDURE OpenDuWindow(VAR name:ARRAY OF CHAR):BOOLEAN;
-
- (*
- The external primary procedure - sets up and opens the window
- *)
-
- BEGIN
- IF (GraphicsBase <> 0) AND (IntuitionBase <> 0) THEN
- DuWindowPtr := InitWindow(name,InitGadgets());
- RETURN (DuWindowPtr # NULL)
- ELSE
- RETURN FALSE
- END
- END OpenDuWindow;
-
-
- (********)
- (* MAIN *)
- (********)
-
- BEGIN
- NullReqPtr := NULL;
- IntuitionBase := OpenLibrary (IntuitionName,0);
- GraphicsBase := OpenLibrary (GraphicsName,0);
- END DuWindow.
-